//
//  ViewController.m
//  RunLoop
//
//  Created by 吴志勇 on 2020/3/17.
//  Copyright © 2020 wzy. All rights reserved.
//  *  每条线程都有唯一的一个与之对应的的RunLoop对象
//  * 主线程的RunLoop已经自动创建好了，子线程的RunLoop需要主动创建
//  * RunLoop在第一次获取时创建，在线程结束时销毁
//
//  * kCFRunLoopDefaultMode:  App默认Mode，通常主线程是在这个Mode下运行的
//  * UITrackingRunLoopMode:  界面跟踪Mode，用于ScrollView追踪触摸滑动，保证界面滑动时不收其他Mode影响
//  * UIInitializationRunLoopMode: 在刚启动App时进入的第一个Mode，启动完成后不再使用
//  * GSEventReceiveRunLoop: 接受系统事件的内部Mode，通常用不到
//  * kCFRunLoopCommonModes: 这是一个占位用的Mode，不是一个真正的Mode

#import "ViewController.h"
#import "Person.h"
#import "iOS.h"

@interface ViewController ()

/*  */
@property (nonatomic, strong) dispatch_source_t source_time;


@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
 
    Person<iOS *> *p = [[Person alloc] init];
    iOS *ios = [[iOS alloc] init];
    p.language = ios;   //使用泛型
    
    [NSThread detachNewThreadSelector:@selector(timer2) toTarget:self withObject:nil];
}

//
- (void)timer{
    NSTimer *timer = [NSTimer timerWithTimeInterval:2.0 target:self selector:@selector(timeRun) userInfo:nil repeats:YES];
    [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];
    
}

//
- (void)timer2{
    
    NSRunLoop *currentRunLoop = [NSRunLoop currentRunLoop];
    
    //该方法内部自动添加到RunLoop中，并且设置运行模式为默认
    [NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(timeRun) userInfo:nil repeats:YES];
    
    //开启RunLoop
    [currentRunLoop run];
}

//
- (void)timeRun{
    NSLog(@"----%@-----%@",[NSThread currentThread], [NSRunLoop currentRunLoop].currentMode);
}

//GCDTimer
- (void)gcdTimer{
    /*
     第一个参数:source的类型DISPATCH_SOURCE_TYPE_TIMER
     第二个参数:描述信息，线程ID
     第二个参数:更详细的描述信息
     第四个参数:队列，决定GCD定时器的任务在哪个线程中执行
     */
    dispatch_source_t timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, dispatch_get_global_queue(0, 0));
    /*
     第一个参数:定时器对象
     第二个参数:起始时间 DISPATCH_TIME_NOW
     第二个参数:间隔时间 GCD中时间的单位是纳米
     第四个参数:精准度  绝对精准0
     */
    dispatch_source_set_timer(timer, DISPATCH_TIME_NOW, 2.0 * NSEC_PER_SEC, 0 * NSEC_PER_SEC);
//    3.设置定时器执行的w任务
    dispatch_source_set_event_handler(timer, ^{
        NSLog(@"%@",[NSThread currentThread]);
    });
//    4.启动执行
    dispatch_resume(timer);
    self.source_time = timer;
}

//使用useNSRunLoop
- (void)useNSRunLoop{
    //获得主线程的RunLoop
    NSRunLoop *mainRunLoop = [NSRunLoop mainRunLoop];
    //获取当前线程的RunLoop
    NSRunLoop *currentRunLoop = [NSRunLoop currentRunLoop];
    
//    转换成core
//    mainRunLoop.getCFRunLoop;
    
//    runloop和线程的关系
    [[[NSThread alloc ] initWithTarget:self selector:@selector(run) object:nil] start];
}

//在runloop中有多个运行模式，但是RunLoop只能选择一个模式运行
//mode里至少有一个timer或者是source
- (void)run{
    NSLog(@"%@",[NSRunLoop currentRunLoop]);
}

//使用coreFundation
- (void)useCFRunLoop{
    NSLog(@"%@",CFRunLoopGetMain());
    NSLog(@"%@",CFRunLoopGetCurrent());
}


//
- (void)download{
    
}
@end
